package com.hotel.mvc.controller;


import hbm.Cliente;
import hbm.ClienteDAO;
import hbm.Cuenta;
import hbm.CuentaDAO;
import hbm.Cuentaservicio;
import hbm.CuentaservicioDAO;
import hbm.Habitacion;
import hbm.HabitacionDAO;
import hbm.Hotel;
import hbm.HotelDAO;
import hbm.Servicio;
import hbm.ServicioDAO;
import hbm.Tipohabitacion;
import hbm.TipohabitacionDAO;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class FacturaController extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@SuppressWarnings("unchecked")
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		String opcion = request.getParameter("opcion");
		
		if(opcion!=null && opcion.equals("facturarCliente")){
			
			List<Cuenta> listaCuentas = (ArrayList<Cuenta>) new CuentaDAO().findAll();
			request.getSession().setAttribute("listaCuentas",listaCuentas);
			
			List<Cliente> listaClientes = (ArrayList<Cliente>) new ClienteDAO().findAll();
			HashMap clientes = new HashMap();
			for(Cliente cliente: listaClientes){
				clientes.put(cliente.getIdCliente(), cliente.getNombreCliente());
			}
			request.getSession().setAttribute("listaClientes",clientes);
			
			response.sendRedirect("./jsp/facturarCliente.jsp");
		}	
		
		
		
		if(opcion!=null && opcion.equals("factura")){
			String idCuenta = request.getParameter("idCuenta");
			String[] arregloIds = idCuenta.split(",");
			Integer idCuentaSeleccionada= Integer.parseInt(arregloIds[0]);
			Integer idClienteSeleccionado= Integer.parseInt(arregloIds[1]);

			
			Cliente cliente = new ClienteDAO().findById(idClienteSeleccionado);
			List <Habitacion> listaHabitaciones = new HabitacionDAO().findByCuentaIdCuenta(idCuentaSeleccionada);
			List <Tipohabitacion> listaTipos = new TipohabitacionDAO().findAll();
			
			HashMap tiposByDescripcion = new HashMap();
			for(Tipohabitacion tipo: listaTipos){
				tiposByDescripcion.put(tipo.getIdTipoHabitacion(), tipo.getDescripcion());
			}
			
			HashMap tiposByPrecio = new HashMap();
			for(Tipohabitacion tipo: listaTipos){
				tiposByPrecio.put(tipo.getIdTipoHabitacion(), tipo.getPrecio());
			}
			
			Habitacion habitacion = new Habitacion();
			Cuenta cuenta = new CuentaDAO().findById(idCuentaSeleccionada);
			
			Integer totalhospedaje=0;
			Date fechaSalida = new Date();
			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");	
			StringBuilder fechaSalidaStr = new StringBuilder (df.format(fechaSalida));
			
			Long fechaInicioMs = cuenta.getFechaLlegada().getTime();
			Long fechaSalidaMs = fechaSalida.getTime();
			Long diferencia = fechaSalidaMs - fechaInicioMs;
			Double diferenciaDias = Math.floor(diferencia / (1000 * 60 * 60 * 24));
			
			for(int i=0;i<listaHabitaciones.size();i++){
				habitacion = listaHabitaciones.get(i);
				totalhospedaje += diferenciaDias.intValue() * (Integer)tiposByPrecio.get(habitacion.getTipoHabitacionIdTipoHabitacion());
			}
			
			Hotel hotel = new HotelDAO().findById(habitacion.getHotelIdHotel());
			
			List <Cuentaservicio> listaCuentaServicio = new CuentaservicioDAO().findByCuentaIdCuenta(idCuentaSeleccionada);
					
			List <Servicio> listaServicios = new ArrayList<Servicio>();
			for (int i=0;i<listaCuentaServicio.size();i++){
				Cuentaservicio cuentaServicio = listaCuentaServicio.get(i);
 					listaServicios.add(new ServicioDAO().findById(cuentaServicio.getServicioIdServicio()));
				
			}
			
			Integer total =0;
			
			for (int i=0;i<listaServicios.size();i++){
				total += listaServicios.get(i).getCostoServicio();
			}
			
			Integer subTotal = total + totalhospedaje;
			
			request.getSession().setAttribute("diferenciaDias",diferenciaDias.intValue());
			request.getSession().setAttribute("subTotal", subTotal);
			request.getSession().setAttribute("listaTipos", listaTipos);
			request.getSession().setAttribute("tiposByPrecio", tiposByPrecio);
			request.getSession().setAttribute("tiposByDescripcion", tiposByDescripcion);
			request.getSession().setAttribute("listaHabitaciones", listaHabitaciones);
			request.getSession().setAttribute("totalHospedaje", totalhospedaje);
			request.getSession().setAttribute("fechaSalida", fechaSalidaStr);
			request.getSession().setAttribute("direccionHotel", hotel.getDireccionHotel());
			request.getSession().setAttribute("nombreCliente", cliente.getNombreCliente());
			request.getSession().setAttribute("apellidoCliente", cliente.getApellidoCliente());
			request.getSession().setAttribute("nitCliente", cliente.getNitCliente());
			request.getSession().setAttribute("listaHabitaciones", listaHabitaciones);
			request.getSession().setAttribute("listaServicios", listaServicios);
			request.getSession().setAttribute("total", total);
			
			response.sendRedirect("./jsp/detalleFactura.jsp");
		}
	}
	
}
